package view;
import java.awt.Color;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Font;

import javax.swing.JLabel;
import javax.swing.SwingConstants;

import model.Sudoku;
import control.SudokuGenerator;
import control.SudokuLoeser;
import control.Stoppuhr;
import control.SudokuReader;
import control.SudokuWriter;


public class SpielAuswahlFenster extends JFrame {
	
	GrundGUI grundGUI;
	
	private Stoppuhr stoppuhr;

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	/* public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					SpielAuswahlFenster frame = new SpielAuswahlFenster();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	*/

	// Methode um die Uhr zu starten
	@SuppressWarnings("deprecation")
	public void uhrStarten(){
		try {
			stoppuhr.stop();
		} catch (Exception exception) {
			
		}
		Stoppuhr stoppuhr = new Stoppuhr(grundGUI);
		stoppuhr.start();
		grundGUI.setStoppuhr(stoppuhr);
	}
	/**
	 * Create the frame.
	 */
	public SpielAuswahlFenster(final GrundGUI grundGUI) {
		setResizable(false);
		
		this.grundGUI = grundGUI;
		grundGUI.getJFrame().setEnabled(false);
		
		
		try {
			for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
				if ("Nimbus".equals(info.getName())) {
					UIManager.setLookAndFeel(info.getClassName());
					break;
				}
			}
		} catch (Exception e) {
			// Wenn Nimbus nicht vorhanden, kann man das Look & Feel noch
			// aendern
		}
		
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		contentPane.setBackground(grundGUI.getJFrame().getContentPane().getBackground());
		
		JButton btnLeicht = new JButton("Leicht");
		btnLeicht.setBackground(Color.WHITE);
		btnLeicht.setFont(new Font("Lucida Grande", Font.PLAIN, 15));
		btnLeicht.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				grundGUI.stringArrayInitialisieren();
				for (int i = 0; i < 9; i++) {
					for (int j = 0; j < 9; j++) {
						grundGUI.btnFeld[i][j].setBackground(new Color(255, 255, 255)); 
					}
				}
				grundGUI.setSudoku(new Sudoku());
				grundGUI.getSudoku().erstelleLeeresFeld();
				SudokuGenerator sudokuGenerator = new SudokuGenerator(grundGUI.getSudoku());
				sudokuGenerator.initialisiereZufallsSudoku();
				SudokuLoeser loeser = new SudokuLoeser(sudokuGenerator.getSudoku());
				loeser.loeseMitBacktracking();
				sudokuGenerator.setSudoku(loeser.getSudoku());
				sudokuGenerator.erstelleLeichtesSpiel();
				grundGUI.setSudoku(sudokuGenerator.getSudoku());
				for (int i = 0; i < 9; i++) {
					for (int j = 0; j < 9; j++) {
						if (grundGUI.getSudoku().byteSudokuFeld[i][j] == 0) {
							grundGUI.btnFeld[i][j].setText("");
							grundGUI.btnFeld[i][j].setBackground(new Color(253, 198, 137));
						} else {
							grundGUI.btnFeld[i][j].setText(""+ grundGUI.getSudoku().byteSudokuFeld[i][j]);
						}
					}
				}
				// Aufruf der Speicher-Methode
				speichereSudokus(model.Data.PFADLEICHTESUDOKUS);
				// Setze die Stern für die Schwierigkeit
				grundGUI.getLblSternEins().setIcon(new ImageIcon(GrundGUI.class.getResource("/Bilder/SudokuSternAusgefuellt.gif")));
				grundGUI.getLblSternZwei().setIcon(new ImageIcon(GrundGUI.class.getResource("/Bilder/SudokuSternLeer.gif")));
				grundGUI.getLblSternDrei().setIcon(new ImageIcon(GrundGUI.class.getResource("/Bilder/SudokuSternLeer.gif")));
				// Nun wird die GrundGUI wieder enabelt
				grundGUI.getJFrame().setEnabled(true);
				grundGUI.getBtnAuflsn().setEnabled(true);
				uhrStarten();
				// Um den Arbeitsspeicher zu entlasten wird der Garbage Collector explizit angestoßen
				System.gc();
				// Danach sollte das Fenster geschlossen werden
				dispose();
			}
		});
		btnLeicht.setBounds(47, 78, 117, 29);
		contentPane.add(btnLeicht);
		
		JButton btnMittel = new JButton("Mittel");
		btnMittel.setBackground(Color.WHITE);
		btnMittel.setFont(new Font("Lucida Grande", Font.PLAIN, 15));
		btnMittel.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				grundGUI.stringArrayInitialisieren();
				for (int i = 0; i < 9; i++) {
					for (int j = 0; j < 9; j++) {
						grundGUI.btnFeld[i][j].setBackground(new Color(255, 255, 255)); 
					}
				}
				grundGUI.setSudoku(new Sudoku());
				grundGUI.getSudoku().erstelleLeeresFeld();
				SudokuGenerator sudokuGenerator = new SudokuGenerator(grundGUI.getSudoku());
				sudokuGenerator.initialisiereZufallsSudoku();
				SudokuLoeser loeser = new SudokuLoeser(sudokuGenerator.getSudoku());
				loeser.loeseMitBacktracking();
				sudokuGenerator.setSudoku(loeser.getSudoku());
				sudokuGenerator.erstelleMittleresSpiel();
				grundGUI.setSudoku(sudokuGenerator.getSudoku());
				for (int i = 0; i < 9; i++) {
					for (int j = 0; j < 9; j++) {
						if (grundGUI.getSudoku().byteSudokuFeld[i][j] == 0) {
							grundGUI.btnFeld[i][j].setText("");
							grundGUI.btnFeld[i][j].setBackground(new Color(253, 198, 137));
						} else {
							grundGUI.btnFeld[i][j].setText(""+ grundGUI.getSudoku().byteSudokuFeld[i][j]);
						}
					}
				}
				// Aufruf der Speicher-Methode
				speichereSudokus(model.Data.PFADMITTLERESUDOKUS);
				// Setze die Stern für die Schwierigkeit
				grundGUI.getLblSternEins().setIcon(new ImageIcon(GrundGUI.class.getResource("/Bilder/SudokuSternAusgefuellt.gif")));
				grundGUI.getLblSternZwei().setIcon(new ImageIcon(GrundGUI.class.getResource("/Bilder/SudokuSternAusgefuellt.gif")));
				grundGUI.getLblSternDrei().setIcon(new ImageIcon(GrundGUI.class.getResource("/Bilder/SudokuSternLeer.gif")));
				// Nun wird die GrundGUI wieder enabelt
				grundGUI.getJFrame().setEnabled(true);
				grundGUI.getBtnAuflsn().setEnabled(true);
				uhrStarten();
				// Um den Arbeitsspeicher zu entlasten wird der Garbage Collector explizit angestoßen
				System.gc();
				// Danach sollte das Fenster geschlossen werden
				dispose();
			}
		});
		btnMittel.setBounds(47, 119, 117, 29);
		contentPane.add(btnMittel);
		
		JButton btnSchwer = new JButton("Schwer");
		btnSchwer.setFont(new Font("Lucida Grande", Font.PLAIN, 15));
		btnSchwer.setBackground(Color.WHITE);
		btnSchwer.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				grundGUI.stringArrayInitialisieren();
				for (int i = 0; i < 9; i++) {
					for (int j = 0; j < 9; j++) {
						grundGUI.btnFeld[i][j].setBackground(new Color(255, 255, 255)); 
					}
				}
				grundGUI.setSudoku(new Sudoku());
				grundGUI.getSudoku().erstelleLeeresFeld();
				SudokuGenerator sudokuGenerator = new SudokuGenerator(grundGUI.getSudoku());
				sudokuGenerator.initialisiereZufallsSudoku();
				SudokuLoeser loeser = new SudokuLoeser(sudokuGenerator.getSudoku());
				loeser.loeseMitBacktracking();
				sudokuGenerator.setSudoku(loeser.getSudoku());
				sudokuGenerator.erstelleSchweresSpiel();
				grundGUI.setSudoku(sudokuGenerator.getSudoku());
				for (int i = 0; i < 9; i++) {
					for (int j = 0; j < 9; j++) {
						if (grundGUI.getSudoku().byteSudokuFeld[i][j] == 0) {
							grundGUI.btnFeld[i][j].setText("");
							grundGUI.btnFeld[i][j].setBackground(new Color(253, 198, 137));
						} else {
							grundGUI.btnFeld[i][j].setText(""+ grundGUI.getSudoku().byteSudokuFeld[i][j]);
						}
					}
				}
				// Aufruf der Speicher-Methode
				speichereSudokus(model.Data.PFADSCHWERESUDOKUS);
				// Setze die Stern für die Schwierigkeit
				grundGUI.getLblSternEins().setIcon(new ImageIcon(GrundGUI.class.getResource("/Bilder/SudokuSternAusgefuellt.gif")));
				grundGUI.getLblSternZwei().setIcon(new ImageIcon(GrundGUI.class.getResource("/Bilder/SudokuSternAusgefuellt.gif")));
				grundGUI.getLblSternDrei().setIcon(new ImageIcon(GrundGUI.class.getResource("/Bilder/SudokuSternAusgefuellt.gif")));
				// Nun wird die GrundGUI wieder enabelt
				grundGUI.getJFrame().setEnabled(true);
				grundGUI.getBtnAuflsn().setEnabled(true);
				uhrStarten();
				// Um den Arbeitsspeicher zu entlasten wird der Garbage Collector explizit angestoßen
				System.gc();
				// Danach sollte das Fenster geschlossen werden
				dispose();
			}
		});
		btnSchwer.setBounds(47, 160, 117, 29);
		contentPane.add(btnSchwer);
		
		JButton btnAbbrechen = new JButton("Abbrechen");
		btnAbbrechen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// GrundGUI wieder enabeln und Fenster schließen
				grundGUI.getJFrame().setEnabled(true);
				dispose();
			}
		});
		btnAbbrechen.setBackground(Color.WHITE);
		btnAbbrechen.setFont(new Font("Lucida Grande", Font.PLAIN, 15));
		btnAbbrechen.setBounds(162, 229, 117, 29);
		contentPane.add(btnAbbrechen);
		
		JLabel lblWarnung = new JLabel("");
		lblWarnung.setHorizontalAlignment(SwingConstants.CENTER);
		lblWarnung.setFont(new Font("Lucida Grande", Font.PLAIN, 15));
		lblWarnung.setBounds(6, 6, 438, 53);
		contentPane.add(lblWarnung);
		
		JButton btnLaden = new JButton("Laden!");
		btnLaden.setFont(new Font("Lucida Grande", Font.PLAIN, 15));
		btnLaden.setBounds(266, 98, 117, 29);
		contentPane.add(btnLaden);
		
		JButton btnErstellen = new JButton("Erstellen!");
		btnErstellen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				grundGUI.setSudoku(new Sudoku());
				grundGUI.getSudoku().erstelleLeeresFeld();
				grundGUI.stringArrayInitialisieren();
				grundGUI.getJFrame().setEnabled(true);
				dispose();
			}
		});
		btnErstellen.setFont(new Font("Lucida Grande", Font.PLAIN, 15));
		btnErstellen.setBounds(266, 146, 117, 29);
		contentPane.add(btnErstellen);
		try {
			if (grundGUI.getSudoku().pruefeObVollstaendig()==false) {
				lblWarnung.setText("<html><body><center>Achtung, dein Spiel ist noch nicht fertig gel&ouml;st!</center></body></html>");
			}
		} catch (NullPointerException exception) {
		}
	}

	public void setStoppuhr(Stoppuhr stoppuhr) {
		this.stoppuhr = stoppuhr;
	}
	
	public void speichereSudokus(String pfad) {
		SudokuWriter writer = new SudokuWriter(pfad);
		SudokuReader reader = new SudokuReader(pfad);
		if (reader.sudokuSchonVorhanden(grundGUI.getSudoku().byteSudokuFeld) == true) {
			// Wenn das Sudoku schon in der Datenbank vorhanden ist,
			// soll es nicht erneut reingeschrieben werden.
		}
		else {
			// Wenn das Sudoku noch nicht vorhanden ist, wird es in die Datenbank geschrieben.
			writer.sudokuSpeichern(grundGUI.getSudoku().byteSudokuFeld);
		}
	}
}
